#include <vector>
#include <string>
#include <iostream>
#include <algorithm>

class Double {
private:
    std::vector<int> digits;  // 存储数字，每个元素代表一位数字
    int exponent;             // 指数，表示小数点的位置
    bool sign;                // 符号，true为正，false为负
    
    // 规范化数字，移除前导零和尾随零
    void normalize() {
        // 移除前导零
        while (!digits.empty() && digits.front() == 0) {
            digits.erase(digits.begin());
            exponent++;
        }
        
        // 移除尾随零
        while (!digits.empty() && digits.back() == 0) {
            digits.pop_back();
        }
        
        // 如果所有数字都是零，确保至少有一个零
        if (digits.empty()) {
            digits.push_back(0);
            exponent = 0;
            sign = true;
        }
    }
    
    // 比较两个Double的绝对值大小
    // 返回: -1: 小于, 0: 等于, 1: 大于
    int compareAbsolute(const Double& other) const {
        // 比较指数
        if (exponent > other.exponent) return 1;
        if (exponent < other.exponent) return -1;
        
        // 指数相同，逐位比较数字
        size_t maxSize = std::max(digits.size(), other.digits.size());
        for (size_t i = 0; i < maxSize; i++) {
            int digit1 = (i < digits.size()) ? digits[i] : 0;
            int digit2 = (i < other.digits.size()) ? other.digits[i] : 0;
            
            if (digit1 > digit2) return 1;
            if (digit1 < digit2) return -1;
        }
        
        return 0;  // 完全相等
    }

public:
    // 构造函数
    Double() : digits({0}), exponent(0), sign(true) {}
    
    Double(double value) {
        fromDouble(value);
    }
    
    Double(const std::string& str) {
        fromString(str);
    }
    
    // 从double转换
    void fromDouble(double value) {
        digits.clear();
        sign = (value >= 0);
        
        if (value == 0) {
            digits.push_back(0);
            exponent = 0;
            return;
        }
        
        value = std::abs(value);
        std::string str = std::to_string(value);
        fromString(str);
    }
    
    // 从字符串转换
    void fromString(const std::string& str) {
        digits.clear();
        sign = true;
        exponent = 0;
        
        if (str.empty()) {
            digits.push_back(0);
            return;
        }
        
        // 处理符号
        size_t start = 0;
        if (str[0] == '-') {
            sign = false;
            start = 1;
        } else if (str[0] == '+') {
            start = 1;
        }
        
        // 查找小数点和数字部分
        bool foundDot = false;
        int digitsBeforeDot = 0;
        
        for (size_t i = start; i < str.size(); i++) {
            if (str[i] == '.') {
                foundDot = true;
                exponent = digitsBeforeDot;
                continue;
            }
            
            if (isdigit(str[i])) {
                digits.push_back(str[i] - '0');
                if (!foundDot) {
                    digitsBeforeDot++;
                }
            }
        }
        
        if (!foundDot) {
            exponent = digitsBeforeDot;
        }
        
        normalize();
    }
    
    // 转换为字符串
    std::string toString() const {
        std::string result;
        
        if (!sign && !(digits.size() == 1 && digits[0] == 0)) {
            result += '-';
        }
        
        if (exponent <= 0) {
            result += "0.";
            result.append(-exponent, '0');
            for (int digit : digits) {
                result += std::to_string(digit);
            }
        } else {
            for (int i = 0; i < exponent; i++) {
                if (i < static_cast<int>(digits.size())) {
                    result += std::to_string(digits[i]);
                } else {
                    result += '0';
                }
            }
            
            if (exponent < static_cast<int>(digits.size())) {
                result += '.';
                for (size_t i = exponent; i < digits.size(); i++) {
                    result += std::to_string(digits[i]);
                }
            }
        }
        
        return result;
    }
    
    // 比较运算符
    bool operator==(const Double& other) const {
        if (sign != other.sign) return false;
        return compareAbsolute(other) == 0;
    }
    
    bool operator!=(const Double& other) const {
        return !(*this == other);
    }
    
    bool operator<(const Double& other) const {
        if (sign != other.sign) {
            return !sign;  // 如果this为负，other为正，则this < other
        }
        
        int cmp = compareAbsolute(other);
        if (sign) {  // 都是正数
            return cmp < 0;
        } else {     // 都是负数
            return cmp > 0;
        }
    }
    
    bool operator>(const Double& other) const {
        return other < *this;
    }
    
    bool operator<=(const Double& other) const {
        return !(other < *this);
    }
    
    bool operator>=(const Double& other) const {
        return !(*this < other);
    }
    
    // 获取内部表示信息（用于调试）
    void debugPrint() const {
        std::cout << "Sign: " << (sign ? "+" : "-") << std::endl;
        std::cout << "Exponent: " << exponent << std::endl;
        std::cout << "Digits: ";
        for (int digit : digits) {
            std::cout << digit;
        }
        std::cout << std::endl;
        std::cout << "Value: " << toString() << std::endl;
    }
    
    // 友元函数，用于输出
    friend std::ostream& operator<<(std::ostream& os, const Double& d) {
        os << d.toString();
        return os;
    }
};

// 测试示例
int main() {
    // 创建Double对象
    Double d1(123.45);
    Double d2("67.89");
    Double d3(-123.45);
    
    // 测试输出
    std::cout << "d1: " << d1 << std::endl;
    std::cout << "d2: " << d2 << std::endl;
    std::cout << "d3: " << d3 << std::endl;
    
    // 测试比较
    std::cout << "\n比较测试:" << std::endl;
    std::cout << "d1 == d2: " << (d1 == d2) << std::endl;
    std::cout << "d1 != d2: " << (d1 != d2) << std::endl;
    std::cout << "d1 < d2: " << (d1 < d2) << std::endl;
    std::cout << "d1 > d2: " << (d1 > d2) << std::endl;
    std::cout << "d1 <= d2: " << (d1 <= d2) << std::endl;
    std::cout << "d1 >= d2: " << (d1 >= d2) << std::endl;
    
    std::cout << "\n负数比较测试:" << std::endl;
    std::cout << "d1 == d3: " << (d1 == d3) << std::endl;
    std::cout << "d1 > d3: " << (d1 > d3) << std::endl;
    std::cout << "d3 < d1: " << (d3 < d1) << std::endl;
    
    // 调试信息
    std::cout << "\n调试信息:" << std::endl;
    d1.debugPrint();
    d2.debugPrint();
    
    return 0;
}

